let activeEffect = null; //当前正在执行的副作用函数




//依赖对象
class Dep {
    constructor() {
        this.effectFns = []
    }

    addEffect(fn) {
        this.effectFns.push(fn)
    }

    notify() {
        this.effectFns.forEach(fn => fn())
    }
}

let weakMapAll = new WeakMap() // 存储所有的依赖


let obj1 = {
    name: "kaki",
    age: '18'
}


//想意识对象
let ProxyObj1 = new Proxy(obj1, {
    get(target, prop) {
        let dep = weakMapAll.get(target)    //根据对象获取依赖 objDeps
        if (!dep) { //如果没有依赖就创建一个 ObjDeps
            dep = new Map()
            weakMapAll.set(target, dep)
        }

        let propsDep = dep.get(prop)
        //属性的dep对象
        if (!propsDep) {
            propsDep = new Dep()
            dep.set(prop, propsDep)
        }

        propsDep.addEffect(activeEffect) //添加副作用函数



        return Reflect.get(target, prop)
    },
    set(target, prop, value, receiver) {

        // 首先设置新的值
        const result = Reflect.set(target, prop, value, receiver); //不会触发set

        // 然后通知依赖副作用
        if (weakMapAll.has(target) && weakMapAll.get(target).has(prop)) {
            weakMapAll.get(target).get(prop).notify(); // 通知依赖副作用函数
        }

        // 返回 Reflect.set 的结果
        return result;
    }

}
)
//副作用函数 
function wactchEffect(fn) {

    activeEffect = fn;
    fn()
    activeEffect = null
}

// 监听副作用函数
wactchEffect(() => {
    console.log(ProxyObj1.name, "第一个副作用");
})

wactchEffect(() => {
    console.log(ProxyObj1.name, "第二个副作用");
})

ProxyObj1.name = "asd"
